home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xarchie-2.0.9 / about.c next >
C/C++ Source or Header  |  1995-06-18  |  7KB  |  268 lines

  1. /*
  2.  * about.c : The "About xarchie" panel, with goofy display
  3.  *
  4.  * George Ferguson, ferguson@cs.rochester.edu, 23 Apr 1993.
  5.  *
  6.  * If either HAVE_RANDOM or HAVE_RAND are defined (config.h), the display
  7.  * is animated randomly, otherwise it just sits there.
  8.  * 13 May 1993: Fixed array bound error in popupAboutPanel().
  9.  *        Changed the way the version info is printed.
  10.  *        Changed style of animation (spare time killer).
  11.  * 30 Jun 1993: Added one more line to About panel for "archie-admin" note.
  12.  * 27 Jul 1993: Only call XtRemoveTimeOut() if we HAVE_RANDOM or HAVE_RAND.
  13.  */
  14. #include <stdio.h>
  15. #include <X11/Intrinsic.h>
  16. #include <X11/Shell.h>
  17. #include <X11/StringDefs.h>
  18. #include <X11/Xaw/Form.h>
  19. #include <X11/Xaw/Label.h>
  20. #include <X11/Xaw/Command.h>
  21. #include "xarchie.h"
  22. #include "patchlevel.h"
  23. #include "about.xbm"
  24. #include "config.h"
  25.  
  26. #define TIMER_LENGTH 250    /* msec */
  27.  
  28. /*
  29.  * Functions defined here
  30.  */
  31. void initAboutActions();
  32. void popupAboutPanel();
  33. void setAboutShellState();
  34.  
  35. static void initAboutWidgets();
  36. static void aboutAction(),aboutDoneAction();
  37. static void drawFrame(),timeoutProc();
  38.  
  39. /*
  40.  * Data defined here:
  41.  */
  42. static Widget aboutShell;
  43. static Widget picture;
  44. static Window window;
  45. static XtIntervalId timer;
  46. static Boolean isPoppedUp;
  47.  
  48. static XtActionsRec actionTable[] = {
  49.     { "about",        aboutAction },
  50.     { "about-done",    aboutDoneAction },
  51. };
  52.  
  53. #define PTS_PER_LINE    3        /* maximum pts per line */
  54. #define LINES_PER_WAVE    6        /* total lines per wave */
  55. #define NUM_WAVES    4        /* number of different waves */
  56. #define NUM_FRAMES    4        /* number of anim frames per wave */
  57.  
  58. static XPoint points[NUM_WAVES][LINES_PER_WAVE][PTS_PER_LINE] = {
  59.     { { {24,33}, { 4,0}, {0, 4} },
  60.       { {22,30}, { 9,0}, {0, 8} },
  61.       { {20,27}, {14,0}, {0,12} },
  62.       { {18,24}, {19,0}, {0,16} },
  63.       { {16,21}, {24,0}, {0,20} },
  64.       { {14,18}, {29,0}, {0,24} } },
  65.     { { {16,18}, { 1,0} },
  66.       { {15,21}, { 3,0} },
  67.       { {14,24}, { 5,0} },
  68.       { {13,28}, { 7,0} },
  69.       { {12,31}, { 9,0} },
  70.       { {11,34}, {11,0} } },
  71.     { { {42,22}, { 1, 1} },
  72.       { {38,23}, { 3, 3} },
  73.       { {34,24}, { 5, 5} },
  74.       { {30,25}, { 7, 7} },
  75.       { {26,26}, { 9, 9} },
  76.       { {22,27}, {11,11} } },
  77.     { { {43,46}, {0, 1} },
  78.       { {40,45}, {0, 3} },
  79.       { {37,44}, {0, 5} },
  80.       { {34,43}, {0, 7} },
  81.       { {31,42}, {0, 9} },
  82.       { {28,41}, {0,11} } }
  83. };
  84. static int num[NUM_WAVES] = { 3, 2, 2, 2 };
  85.  
  86. static GC clearGC,setGC;
  87. static int wave,frame;
  88.  
  89. /*    -    -    -    -    -    -    -    -    */
  90.  
  91. void
  92. initAboutActions()
  93. {
  94.     XtAppAddActions(appContext,actionTable,XtNumber(actionTable));
  95.     wave = 0;
  96.     frame = -1;        /* so we start with frame 0 of wave 0 */
  97. }
  98.  
  99. /*ARGSUSED*/
  100. static void
  101. aboutAction(w,event,params,num_params)
  102. Widget w;
  103. XEvent *event;
  104. String *params;
  105. Cardinal *num_params;
  106. {
  107.     popupAboutPanel();
  108. }
  109.  
  110. /*ARGSUSED*/
  111. static void
  112. aboutDoneAction(w,event,params,num_params)
  113. Widget w;
  114. XEvent *event;
  115. String *params;
  116. Cardinal *num_params;
  117. {
  118. #if defined(HAVE_RANDOM) || defined(HAVE_RAND)
  119.     XtRemoveTimeOut(timer);
  120. #endif
  121.     isPoppedUp = False;
  122.     XtPopdown(aboutShell);
  123. }
  124.  
  125. /*    -    -    -    -    -    -    -    -    */
  126.  
  127. void
  128. popupAboutPanel()
  129. {
  130.     XGCValues values;
  131.     Arg args[2];
  132.     Pixel fg,bg;
  133.  
  134.     if (isPoppedUp) {
  135.     XRaiseWindow(display,XtWindow(aboutShell));
  136.     return;
  137.     }
  138.     if (aboutShell == NULL) {
  139.     initAboutWidgets();
  140.     window = XtWindow(picture);
  141.     XtSetArg(args[0],XtNforeground,&fg);
  142.     XtSetArg(args[1],XtNbackground,&bg);
  143.     XtGetValues(picture,args,2);
  144.     values.function = GXcopy;
  145.     values.foreground = fg;
  146.     setGC = XCreateGC(display,root,GCFunction|GCForeground,&values);
  147.     values.foreground = bg;
  148.     clearGC = XCreateGC(display,root,GCFunction|GCForeground,&values);
  149.     }
  150.     isPoppedUp = True;
  151.     XtPopup(aboutShell,XtGrabNone);
  152. #if defined(HAVE_RANDOM) || defined(HAVE_RAND)
  153.     timer = XtAppAddTimeOut(appContext,(unsigned long)TIMER_LENGTH,
  154.                 timeoutProc,NULL);
  155. #endif
  156. }
  157.  
  158. static void
  159. initAboutWidgets()
  160. {
  161.     Pixmap bitmap;
  162.     Widget form;
  163.     Arg args[1];
  164.     char buf[64];
  165.  
  166.     bitmap = XCreateBitmapFromData(display,root,(char *)about_bits,
  167.                    about_width,about_height);
  168.     aboutShell = XtCreatePopupShell("aboutShell",topLevelShellWidgetClass,
  169.                     toplevel,NULL,0);
  170.     form = XtCreateManagedWidget("aboutForm",formWidgetClass,
  171.                  aboutShell,NULL,0);
  172. #ifdef BETA
  173.     sprintf(buf,"Xarchie %.1fb%d",VERSION,PATCHLEVEL);
  174. #else
  175.     sprintf(buf,"Xarchie %.1f.%d",VERSION,PATCHLEVEL);
  176. #endif
  177.     XtSetArg(args[0],XtNlabel,buf);
  178.     (void)XtCreateManagedWidget("aboutLabel0",labelWidgetClass,form,args,1);
  179.     (void)XtCreateManagedWidget("aboutLabel1",labelWidgetClass,form,NULL,0);
  180.     (void)XtCreateManagedWidget("aboutLabel2",labelWidgetClass,form,NULL,0);
  181.     XtSetArg(args[0],XtNbitmap,bitmap);
  182.     picture = XtCreateManagedWidget("aboutLabel3",labelWidgetClass,
  183.                     form,args,1);
  184.     (void)XtCreateManagedWidget("aboutLabel4",labelWidgetClass,form,NULL,0);
  185.     (void)XtCreateManagedWidget("aboutLabel5",labelWidgetClass,form,NULL,0);
  186.     (void)XtCreateManagedWidget("aboutLabel6",labelWidgetClass,form,NULL,0);
  187.     (void)XtCreateManagedWidget("aboutDoneButton",commandWidgetClass,
  188.                 form,NULL,0);
  189.     XtRealizeWidget(aboutShell);
  190.     (void)XSetWMProtocols(XtDisplay(aboutShell),XtWindow(aboutShell),
  191.               &WM_DELETE_WINDOW,1);
  192. }
  193.  
  194. /* This will never get called unless HAVE_RANDOM or HAVE_RAND is defined. */
  195. /*ARGSUSED*/
  196. static void
  197. timeoutProc(client_data,id)
  198. XtPointer client_data;
  199. XtIntervalId *id;
  200. {
  201.     /* Clear old lines (after first call) */
  202.     if (frame >= 0)
  203.     drawFrame(clearGC);
  204.     /* Compute next frame and/or wave */
  205.     if (frame < NUM_FRAMES-1) {
  206.     frame += 1;
  207.     } else {
  208. #ifdef HAVE_RANDOM
  209.     wave = random() % NUM_WAVES;
  210. #else
  211. #ifdef HAVE_RAND
  212.     wave = rand() % NUM_WAVES;
  213. #endif
  214. #endif
  215.     frame = 0;
  216.     }
  217.     /* Draw new lines */
  218.     drawFrame(setGC);
  219.     /* Reset timer */
  220.     timer = XtAppAddTimeOut(appContext,(unsigned long)TIMER_LENGTH,
  221.                 timeoutProc,NULL);
  222. }
  223.  
  224. /*
  225.  * Draw or clear the current frame of the current wave by drawing some of
  226.  * the lines.
  227.  */
  228. static
  229. void drawFrame(gc)
  230. GC gc;
  231. {
  232.     int i,first,last;
  233.  
  234.     switch (frame) {
  235.       case 0:
  236.     first = 0; last = 1; break;
  237.       case 1:
  238.     first = 0; last = 3; break;
  239.       case 2:
  240.     first = 2; last = 5; break;
  241.       case 3:
  242.     first = 4; last = 5; break;
  243.     }
  244.     for (i=first; i <= last; i++) {
  245.     XDrawLines(display,window,gc,
  246.            points[wave][i],num[wave],CoordModePrevious);
  247.     }
  248. }
  249.  
  250. void
  251. setAboutShellState(state)
  252. int state;
  253. {
  254.     if (!isPoppedUp)
  255.     return;
  256.     switch (state) {
  257.     case NormalState:
  258.         XtMapWidget(aboutShell);
  259.         timer = XtAppAddTimeOut(appContext,(unsigned long)TIMER_LENGTH,
  260.                     timeoutProc,NULL);
  261.         break;
  262.     case IconicState:
  263.         XtRemoveTimeOut(timer);
  264.         XtUnmapWidget(aboutShell);
  265.         break;
  266.     }
  267. }
  268.